/**
 * 在任何情况下，都不应该使用这些装箱类型。
 * 
 * 当不确定某个变量的具体类型，但能确定它不是原始类型，可以使用 object，
 * 更推荐进一步区分，也就是使用 
 * Record<string, unknown> 或 Record<string, any> 表示对象，
 * unknown[] 或 any[] 表示数组，
 * (...args: any[]) => any表示函数这样。
 * 
 * 同样要避免使用{}。{}意味着任何非 null / undefined 的值，从这个层面上看，使用它和使用 any 一样恶劣。
 * */

//Object
// 对于 undefined、null、void 0 ，需要关闭 strictNullChecks
const tmp1: Object = undefined;
const tmp2: Object = null;
const tmp3: Object = void 0;
const tmp4: Object = 'hanxuming';
const tmp5: Object = 599;
const tmp6: Object = { name: 'hanxuming' };
const tmp7: Object = () => {};
const tmp8: Object = [];
tmp6.name = 18;

//String
const tmp9: String = undefined;
const tmp10: String = null;
const tmp11: String = void 0;
const tmp12: String = 'hanxuming';
// 以下不成立，因为不是字符串类型的拆箱类型
const tmp13: String = 599; // X
const tmp14: String = { name: 'hanxuming' }; // X
const tmp15: String = () => {}; // X
const tmp16: String = []; // X

//{}
const tmp25: {} = undefined; // 仅在关闭 strictNullChecks 时成立，下同
const tmp26: {} = null;
const tmp27: {} = void 0; // void 0 等价于 undefined
const tmp28: {} = 'hanxuming';
const tmp29: {} = 599;
const tmp30: {} = { name: 'hanxuming' };
const tmp31: {} = () => {};
const tmp32: {} = [];
//虽然能够将其作为变量的类型，但无法对这个变量进行任何赋值操作：
tmp30.age = 18; // X 类型“{}”上不存在属性“age”。

//export {}：解决“无法重新声明块范围变量”错误提示问题
export { }